/**
 * 
 */
package com.sicocre.business.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.stereotype.Repository;

import com.sicocre.beans.Apertura;
import com.sicocre.beans.Cliente;
import com.sicocre.beans.Pagos;
import com.sicocre.business.dao.IAperturaDao;

/**
 * @author lserrano
 *
 */

@Repository
public class AperturaDaoImpl implements IAperturaDao {

	private static final Logger log = Logger.getLogger(AperturaDaoImpl.class);

	private JdbcTemplate jdbcTemplate;

	public static final String INSERT_APERTURA = "INSERT INTO sicocre.apertura(id_apertura,credito_sol,num_pagos,cuota,iva,subtotal,total,fch_apertura, cve_empleado, tipo_venta, clave_cliente, id_status, folio) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)";
	public static final String INSERT_PAGOS = "INSERT INTO sicocre.pago(monto_pago, fch_pago,tdc, num_tdc,cheque,num_cheque,id_banco,efectivo,id_apertura)VALUES (?,?,?,?,?,?,?,?,?)";    
	public static final String SELECT_MAX_APERTURA="select max(id_apertura) + 1 from sicocre.apertura"; 
	public static final String SELECT_MAX_FOLIO="select max(folio) + 1 from sicocre.apertura"; 
	public static final String FOLIO_AGREGADO="select max(folio) from sicocre.apertura";
	public static final String SELECT_CLIENTE="select * from sicocre.cliente where clave_cliente = ?";
	public static final String SELECT_COUNT_APER="select count(*) from sicocre.apertura where clave_cliente = ?"; 
	public static final String SELECT_COUNT_CRE="select count(*) from sicocre.apertura where clave_cliente = ?"; 
	public static final String UPDATE_FOLIO="update apertura set folio = ? where clave_cliente = ?";
	
	@Autowired
	public void setDataSource(DataSource ds){
		jdbcTemplate=new JdbcTemplate(ds);
	}



	public int insertar(Apertura apertura) {
		// TODO Auto-generated method stub
		int idApe = 1;
		String contrato = "200";
		try{
			idApe= jdbcTemplate.queryForObject(SELECT_MAX_APERTURA, Integer.class);
			contrato= jdbcTemplate.queryForObject(SELECT_MAX_FOLIO, String.class);
		}catch(Exception exc){
			log.error("No hay resultados para la consulta enviada...");
			idApe = 1;
			contrato ="200";
		}
		apertura.setIdApertura(idApe);
		apertura.setFolio(contrato);

		
		int insertApertura = jdbcTemplate.update(INSERT_APERTURA,new Object[]{apertura.getIdApertura(),apertura.getCreditoSolicitud(),apertura.getNumPagos(),apertura.getCuotaApertura(),
				apertura.getIva(),apertura.getCuotaApertura(),apertura.getTotal(),apertura.getFchApertura(),apertura.getEmpleado().getCveEmpleado(),apertura.getTipoVenta(),apertura.getCliente().getClave(), apertura.getStatus().getIdStatus(), apertura.getFolio()});

		if (apertura.getPagos().getMonto() >0){
		int insertPago = insertPago(apertura);
		return insertApertura + insertPago;
		}else{
		return insertApertura;	
		}
		
	}
	
	
	private int insertPago(Apertura apertura){
		Pagos pago =  apertura.getPagos(); 
		
		
		int tdc =0;
		int cheque=0;
		int efectivo =0;

		if (pago.isTdc()){
			tdc = 1;
			log.info("EL valor de TDC es tru...");
		}
		if (pago.isCheque()){
			cheque=1;
		}
		if(pago.isEfectivo()){
			efectivo=1;
		}

		
		return jdbcTemplate.update(INSERT_PAGOS,new Object[]{pago.getMonto(), pago.getFchPago(), tdc, pago.getNumTdc(),
				cheque, pago.getNumCheque(), pago.getBanco().getIdBanco(), efectivo, apertura.getIdApertura() });
		
	}

	
	
	
	public Apertura consultaApertura(int cve) {
		// TODO Auto-generated method stub
		return jdbcTemplate.query(SELECT_CLIENTE,new Object[]{new Integer(cve)},new ResultSetExtractor<Apertura>(){
			       @Override 
			       public Apertura extractData(ResultSet rs) throws SQLException,
					DataAccessException {
				    Cliente cliente = new Cliente();
				    Apertura apertura = new Apertura();
				    if(rs.next()){				    
					cliente.setClave(rs.getInt("clave_cliente"));
					cliente.setNombre(rs.getString("nombre_cliente"));	
					cliente.setaPaterno(rs.getString("apater_cliente"));
					cliente.setaMaterno(rs.getString("amater_cliente"));					
					apertura.setCliente(cliente);
				    }
		            return apertura;
				    
		        }					    
		});	    
	}
	
	
	public int cantApe(int cve) {
		// TODO Auto-generated method stub
		int Cantidad = 0;
		try{
			Cantidad= jdbcTemplate.queryForObject(SELECT_COUNT_APER, new Object[]{new Integer(cve)}, Integer.class);
		}catch(Exception exc){
			log.error("No hay resultados para la consulta enviada...");
			Cantidad = 0;
		}
		return Cantidad;
	}
	
	public int cantCre(int cve) {
		// TODO Auto-generated method stub
		int Credito = 0;
		try{
			Credito= jdbcTemplate.queryForObject(SELECT_COUNT_CRE,new Object[]{new Integer(cve)}, Integer.class);
		}catch(Exception exc){
			log.error("No hay resultados para la consulta enviada...");
			Credito = 0;
		}
		return Credito;
	}

	
		 
	 public void actualizaFolio(int cve, String folio)
	 {
	     this.jdbcTemplate.update(UPDATE_FOLIO, new Object[] {folio, cve});
	 }
	 
	 public String contrato(){
		 String contrato = jdbcTemplate.queryForObject(FOLIO_AGREGADO, String.class);
		 
		 return contrato;
	 }

	
}
